package com.itheima.d3_annotation;

/**
 * 目标：认识元注解，搞清楚元注解的作用。
 *
 * 元注解：修饰注解的注解。
 *
 * 元注解有两个：
 *  @Target作用:          约束自定义注解只能在哪些地方使用。声明被修饰的注解只能在哪些位置使用
 *  @Retention作用：      声明注解的保留周期（生命周期）
 *
 *@Target 中可使用的值:   定义在ElementType枚举类中。常用值如下：
 *  TYPE，类，接口
 *  FIELD, 成员变量
 * METHOD, 成员方法
 * PARAMETER, 方法参数
 * CONSTRUCTOR, 构造器
 * LOCAL_VARIABLE, 局部变量
 *
 * @Retention 中可使用的值:   定义在RetentionPolicy枚举类中。常用值如下:
 *  SOURCE：             注解只作用在源码阶段，生成的字节码文件中不存在
 *  CLASS（默认值）：      注解作用在源码阶段，字节码文件阶段，运行阶段不存在
 *  RUNTIME：            注解作用在源码阶段，字节码文件阶段，运行阶段（也就是一直保留到运行阶段，为开发常用）
 *
 *  元注解是什么？
 * 注解注解的注解
 *  @Target 约束自定义注解可以标记的范围。
 *  @Retention 用来约束自定义注解的存活范围。
 *
 * @Test 注解就有两个元注解：
 *  @Retention(RetentionPolicy.RUNTIME)      一直保留到运行阶段
 *  @Target({ElementType.METHOD})            只能修饰方法
 * public @interface Test{}
 *  其中Target注解源码里面就有一个value特殊属性 ElementType[] value();
 *  其中Retention注解源码里面就有一个value特殊属性 RetentionPolicy value();
 *  value属性，如果只有一个value属性的情况下，使用value属性的时候可以省略value名称不写!!
 */
@MyTest3
public class AnnotationTest2 {

    //会报错'@MyTest3' not applicable to field，因为自定义的@MyTest3注解里面的元注解是：ElementType.TYPE，
    // 所以当前被修饰的注解只能用在类上
    // @MyTest3
    private String name;

    @MyTest3        // @MyTest3 注解的元注解是：ElementType.METHOD
    public void test(){

    }
}
